再來要寫一個簡單的小應用了,在這邊會用兩個 package 來介紹,一個是 golang standard lib,一個是我個人很常用的 gorilla 這個團隊推出的 mux 套件,先來介紹 standard 版的
這是一個 golang 標準內建的 http package,這要如何正確使用呢?
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World")
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
此範例,無法直接在 playground 執行,故不提供執行連結
由上面看到,這個範例簡單,就能透過瀏覽器,在這個範例所在的 ip ex http://{ip}/ping ,就能看到一個 pong 字串。
那如果要輸出 json 呢? 其實也很簡單如下
package main
import (
"encoding/json"
"log"
"net/http"
)
type UserInfo struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
http.HandleFunc("/api/query", func(w http.ResponseWriter, r *http.Request) {
u := &UserInfo{
Name: "syhlion",
Age: 18,
}
b, err := json.Marshal(u)
if err != nil {
log.Println(err)
return
}
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
w.WriteHeader(http.StatusOK)
w.Write(b)
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
由上面可以看到,只要存取 http://{ip}/api/query ,就能得到下面的 json 的 response
{
name:"syhlion",
age:18
}
再來介紹的是我個人很喜歡用的第三方套件 mux ,我喜歡的原因是他提供的 api ,可以跟原生的參數完全相容,沒有太多多餘的包裝,但又有很多方便寫 router 的方法
package main
import (
"fmt"
"github.com/gorilla/mux"
)
func main() {
r := mux.NewRouter()
r.HandleFunc("/api/query/{name}", func(w http.ResponseWriter, r *http.Request) {
vars = mux.Vars(r)
//這邊就把 name 帶入 UserInfo
u := &UserInfo{
Name: vars["name"],
Age: 18,
}
b, err := json.Marshal(u)
if err != nil {
log.Println(err)
return
}
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
w.WriteHeader(http.StatusOK)
w.Write(b)
})
//聽8000 port
log.Fatal(http.ListenAndServe(":8000", r))
}
由上面可以看到 mux.Vars ,可以自動幫你 parse router 裡面設定的 {name},它有支援簡易的正則判斷,詳細可以參閱官網
最後一個範例!!沒寫好
package main
import (
"fmt"
"github.com/gorilla/mux"
"net/http"
"encoding/json"
"log"
)
type UserInfo struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
fmt.Println("開始...")
r := mux.NewRouter()
r.HandleFunc("/api/query/{name}", func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
//這邊就把 name 帶入 UserInfo
u := &UserInfo{
Name: vars["name"],
Age: 18,
}
b, err := json.Marshal(u)
if err != nil {
log.Println(err)
return
}
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
w.WriteHeader(http.StatusOK)
w.Write(b)
})
//聽8000 port
log.Fatal(http.ListenAndServe(":8000", r))
}